﻿using System;
using System.Collections.Generic;
using System.Text;

using Sinacor.Servico.Bovespa.Ordens.BusinessEntity;
using Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request;
using Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Response;


namespace Sinacor.Servico.Bovespa.Ordens.Service.ServiceImplementation.Translator
{
    /// <summary>
    /// Traduz instâncias de "Request.ConsultarNegocioOrdemDigitacao" 
    /// para BusinessEntity ou Parameter (e vice-versa)
    /// TODO: Classe aguardando especificacao oficial
    /// </summary>
    public class TranslateConsultarNegocioOrdemDigitacao
    {
        /// <summary>
        /// Traduz uma instância de 
        /// "Request.ConsultarNegocioOrdemDigitacao" para 
        /// "BusinessEntity.Parameter.ConsultarNegocioOrdemDigitacao"
        /// </summary>
        public BusinessEntity.Parameter.ConsultarNegocioOrdemDigitacaoRequest ToParameter(
            DataContract.Request.ConsultarNegocioOrdemDigitacaoRequest request
        )
        {
            
            BusinessEntity.Parameter.ConsultarNegocioOrdemDigitacaoRequest parm =
                new BusinessEntity.Parameter.ConsultarNegocioOrdemDigitacaoRequest();
            
            parm.DataOrdem = request.DataOrdem;
            parm.DataPregao = request.DataPregao;
            parm.NumeroOrdem = request.NumeroOrdem;
            parm.NumeroOrdemSubSequencia = request.NumeroOrdemSubSequencia;

            return parm;
        }

        /// <summary>
        /// Traduz uma lista de "BusinessEntity.Negocio" para uma lista de "Response.NegocioResponse"
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public List<DataContract.Response.NegocioResponse> ToResponse(List<BusinessEntity.Negocio> list)
        {
            List<Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Response.NegocioResponse> responseList = new List<NegocioResponse>();

            foreach (Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Negocio negocio in list)
            {
                responseList.Add(this.ToResponse(negocio));
            }

            return responseList;
        }


        /// <summary>
        /// Traduz uma instância de "BusinessEntity.Negocio" para "Response.NegocioResponse"
        /// </summary>
        /// <param name="negocio"></param>
        /// <returns></returns>
        public DataContract.Response.NegocioResponse ToResponse( BusinessEntity.Negocio negocio )
        {
            Ordens.Service.DataContract.Response.NegocioResponse negocioResponse = new Ordens.Service.DataContract.Response.NegocioResponse();

            negocioResponse.Bolsa = negocio.Bolsa;
            negocioResponse.Cliente = negocio.CodigoCliente;
            negocioResponse.CodigoCorrespondente = negocio.Correspondente.Codigo;
            negocioResponse.CodigoTitulo = negocio.Titulo.Codigo;
            negocioResponse.ContraParte = negocio.ContraParte;
            negocioResponse.DataMovimento = negocio.DataMovimento ;
            negocioResponse.DataNegocio = negocio.DataMovimento ;
            negocioResponse.DataPregao = negocio.DataPregao;
            negocioResponse.DiasLiquidacao = negocio.DiasLiquidacao;
            negocioResponse.DigitoNegocio = negocio.DigitoNegocio;
            negocioResponse.Estrategia = (DataContract.Enum.TipoEstrategia?) negocio.TipoEstrategia;
            negocioResponse.FatorValorizacao = negocio.FatorValorizacao;
            negocioResponse.HoraNegocio = negocio.HoraNegocio;
            negocioResponse.NaoLiquidaNota = negocio.NaoLiquidaNota;
            negocioResponse.NegociadoAfterMarket = negocio.NegociadoAfterMarket;
            negocioResponse.NumeroNegocio = negocio.NumeroNegocio;
            negocioResponse.Observacao = negocio.Observacao;
            negocioResponse.Operador = negocio.Operador;
            negocioResponse.PontaGeradoraOferta = negocio.PontaGeradoraOferta;
            negocioResponse.PrazoTermo = negocio.PrazoTermo;
            negocioResponse.Preco = negocio.Preco;
            negocioResponse.Quantidade = negocio.Quantidade;
            negocioResponse.QuantidadeCasada = negocio.QuantidadeCasada;
            negocioResponse.Saldo = negocio.Saldo;
            negocioResponse.TipoCasamento = (DataContract.Enum.TipoCasamento)negocio.TipoCasamento;
            negocioResponse.TipoLiquidacao = (DataContract.Enum.TipoLiquidacaoNegocio?)negocio.TipoLiquidacaoNegocio;
            negocioResponse.TipoMercado = (DataContract.Enum.TipoMercado?)negocio.TipoMercado;
            negocioResponse.TipoNaturezaOperacao = (DataContract.Enum.TipoNaturezaOperacao?)negocio.TipoNaturezaOperacao;
            negocioResponse.TipoOfertaBovespaFix = (DataContract.Enum.TipoOfertaBovespaFix?)negocio.TipoOfertaBovespaFix;
            negocioResponse.TipoOrigem = (DataContract.Enum.TipoOrigemNegocio?)negocio.TipoOrigem;
            negocioResponse.TipoSituacao = (DataContract.Enum.TipoSituacaoCasamento?)negocio.TipoSituacaoCasamentoOrdem;
            negocioResponse.TipoTermo = (DataContract.Enum.TipoTermo?)negocio.TipoTermo;
            
            /// TODO: verificar: propriedade e´ um TituloResponse
            if (negocio.Titulo != null )
                negocioResponse.Titulo =
                    Sinacor.Servico.Bovespa.Titulo.
                    Service.ServiceImplementation.Translator.
                    TranslateTituloResponse.ToTituloResponse(negocio.Titulo);

            negocioResponse.TituloObjeto = negocio.TituloObjeto;
            negocioResponse.VencimentoOpcoesTermo = negocio.VencimentoOpcoesTermo;

            return negocioResponse;
        }



    }
}
